#pragma once

#include <cstdint>
#include <cstddef>

class CircularBuffer
{
private:

	uint8_t* buffer = nullptr;//内部真正的数组
	size_t bufferSize = 0;//内部真正的数组大小 单位字节
	
public:
	class iterator
	{
	private:
		uint8_t* position = nullptr;
	public:
		iterator operator+=(int a);
	};

public:
	/**
	 * @brief 清空此循环缓冲区
	 * @note 可以使用此函数清空循环缓冲区
	 */
	void clear();

public:
	/**
	 * @brief 储存的数据量
	 * @return 储存的数据量
	 * @note 也就是未处理的数据长度
	 */
	size_t size();

public:
	/**
	 * @brief 最大容量
	 * @return 最大容量
	 */
	size_t capacity();

public:
	/**
	 * @brief 是否为空
	 * @return true 是
	 * @return false 否
	 */
	bool empty();

public:
	/**
	 * @brief 数据区开头
	 * @return 有数据 数据区开头的指针
	 * @return 没有数据 nullptr
	 */
	uint8_t* begin();

public:
	/**
	 * @brief 数据区结尾
	 * @return 有数据 数据区最后一个的指针
	 * @return 没有数据 nullptr
	 */
	uint8_t* end();

public:
	/**
		* @brief 向此缓冲区追加数据
		* @param data 要写入的数据指针
		* @param length 要写入的数据的长度
		* @return true 成功
		* @return false 失败
		*/
	bool append(const uint8_t* data, size_t length);

public:
	/**
		* @brief 从此循环缓冲区中读出数据
		* @param rBuffer 读取到的缓冲区
		* @param length 要求读取的长度
		* @return true 成功
		* @return false 失败
		*/
	bool consume(uint8_t* rBuffer, size_t length);

public:
	/**
	 * @brief 删除迭代器前的所有数据
	 * @param it 迭代器
	 * @return true 成功
	 * @return false 失败
	 */
	bool eraseFront(uint8_t* it);

public:
	/**
	 * @brief 查找特定数据
	 * @param target 目标数据指针
	 * @param length 目标数据长度
	 * @return 找到 目标位置
	 * @return 没有找到 nullptr
	 */
	uint8_t* find(const uint8_t* target, size_t length);

public:
	/**
	 * @brief 打印，测试用
	 */
	void printfCircularBuffer();
};